using System;
using System.ComponentModel.DataAnnotations;

namespace Matrix.Notification.Application.Contracts.Dto
{
    /// <summary>
    /// 日期时间范围DTO
    /// </summary>
    public class DateTimeRangeDto
    {
        /// <summary>
        /// 开始时间
        /// </summary>
        public DateTime? StartTime { get; set; }

        /// <summary>
        /// 结束时间
        /// </summary>
        public DateTime? EndTime { get; set; }

        /// <summary>
        /// 验证日期时间范围是否有效
        /// </summary>
        /// <returns>如果范围有效返回true，否则返回false</returns>
        public bool IsValid()
        {
            if (!StartTime.HasValue || !EndTime.HasValue)
                return true;

            return StartTime.Value <= EndTime.Value;
        }

        /// <summary>
        /// 获取时间跨度的总天数
        /// </summary>
        /// <returns>总天数</returns>
        public double? GetTotalDays()
        {
            if (!StartTime.HasValue || !EndTime.HasValue)
                return null;

            return (EndTime.Value - StartTime.Value).TotalDays;
        }

        /// <summary>
        /// 获取时间跨度的总小时数
        /// </summary>
        /// <returns>总小时数</returns>
        public double? GetTotalHours()
        {
            if (!StartTime.HasValue || !EndTime.HasValue)
                return null;

            return (EndTime.Value - StartTime.Value).TotalHours;
        }

        /// <summary>
        /// 获取时间跨度的总分钟数
        /// </summary>
        /// <returns>总分钟数</returns>
        public double? GetTotalMinutes()
        {
            if (!StartTime.HasValue || !EndTime.HasValue)
                return null;

            return (EndTime.Value - StartTime.Value).TotalMinutes;
        }

        /// <summary>
        /// 检查指定时间是否在范围内
        /// </summary>
        /// <param name="dateTime">要检查的时间</param>
        /// <returns>如果在范围内返回true，否则返回false</returns>
        public bool Contains(DateTime dateTime)
        {
            if (!StartTime.HasValue && !EndTime.HasValue)
                return true;

            if (StartTime.HasValue && dateTime < StartTime.Value)
                return false;

            if (EndTime.HasValue && dateTime > EndTime.Value)
                return false;

            return true;
        }
    }
}